#ifndef _BSP_BASE_H
#define _BSP_BASE_H

#include "stdint.h"
#include "stdio.h"

// UART 帧定义
#define UART_HEAD_HOST_TO_SLAVE       0x73
#define UART_HEAD_SLAVE_TO_HOST       0x68
#define UART_TAIL                     0x43


// UART 命令字
#define UART_CMD_GET_DEVICE_INFO    0x61
#define UART_CMD_WIFI_CONFIG        0x62
#define UART_CMD_SET_ORDER          0x63
#define UART_CMD_GET_SENSOR         0x64


#define CMD_IDX_BSP_VERSION         0x01



// 配置命令 --- 数据索引
#define CFG_IDX_DEVICE_ID                0x03

#define CFG_IDX_WIFI_AP_SSID             0x01
#define CFG_IDX_WIFI_AP_PASSWORD         0x02
#define CFG_IDX_PC_IP                    0x03
#define CFG_IDX_PC_UDP_PORT              0x04
#define CFG_IDX_DEVICE_UDP_PORT          0x05

#define CFG_IDX_WIFI_UDP_STATUS          0x01
#define CFG_IDX_WIFI_DEVICE_IP           0x02



// 数组长度宏定义
#define BUF_LEN_AP_SSID             32
#define BUF_LEN_AP_PASSWORD         32
#define BUF_LEN_PC_UDP_IP           18

typedef struct{

    char     wifi_ap_ssid[BUF_LEN_AP_SSID];
    char     wifi_ap_password[BUF_LEN_AP_PASSWORD];

    char     pc_ip[BUF_LEN_PC_UDP_IP];
    uint16_t pc_udp_port;

    char     device_ip[BUF_LEN_PC_UDP_IP];
    uint16_t device_udp_port;

    uint8_t  device_type;
    uint8_t  device_id;

    uint8_t  wifi_udp_status;
    
}board_config_t;



//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Timer

// 计时函数的输入参数
#define IDLE 0x0
#define RUN  0x1




//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// UART

#define UART_BUF_LEN (200)

#define UART_PORT_USB (0)
#define UART_PORT_UDP (1)

#define UART_FLAG_IDLE       (0)
#define UART_FLAG_ONGOING    (1)
#define UART_FLAG_FINISHED   (2)

typedef struct 
{
  uint8_t uart_port;

  uint8_t send_buf[UART_BUF_LEN];
  uint8_t send_len;
  uint8_t send_index;
  uint8_t send_flag;

  uint8_t recv_buf[UART_BUF_LEN];
  uint8_t recv_len;
  uint8_t recv_index;
  uint8_t recv_flag;

}uart_data_t;

extern volatile uart_data_t g_uart_data_usb;
extern volatile uart_data_t g_uart_data_udp;


/**************************************************************************
 * 函数名称：bsp_uart_send
 * 函数说明：从串口发送数据
 * 参    数：[in/out] uart_data: 待处理的串口数据结构体指针
 * 返 回 值: UART_FLAG_ONGOING  : 正在处理
 *          UART_FLAG_FINISHED : 完成
 *          UART_FLAG_IDLE     : 空闲
 *************************************************************************/
uint8_t bsp_uart_send( uart_data_t *uart_data );

/**************************************************************************
 * 函数名称：bsp_uart_recv_flag
 * 函数说明：从串口接收数据
 * 参    数：[in/out] uart_data: 待处理的串口数据结构体指针
 *          [out]    recv_buf :  将 uart_data 中的 recv_buf 
 * 返 回 值: UART_FLAG_ONGOING  : 正在处理
 *          UART_FLAG_FINISHED : 完成
 *          UART_FLAG_IDLE     : 空闲
 *************************************************************************/
uint8_t bsp_uart_recv( uart_data_t *uart_data );

/**************************************************************************
 * 函数名称：bsp_uart_clear_recv_buf
 * 函数说明：复位 uart_data 的接收数据
 * 参    数：[out] uart_data     : 待处理的串口数据结构体指针
 * 返 回 值: 无
 *************************************************************************/
void bsp_uart_clear_recv_buf(  uart_data_t *uart_data );

/**************************************************************************
 * 函数名称：bsp_uart_clear_send_buf
 * 函数说明：复位 uart_data 的发送数据
 * 参    数：[out] uart_data     : 待处理的串口数据结构体指针
 * 返 回 值: 无
 *************************************************************************/
void bsp_uart_clear_send_buf(  uart_data_t *uart_data );


uint32_t bsp_timing_uart_usb_receive ( uint8_t flag);

uint32_t bsp_timing_uart_udp_receive ( uint8_t flag);

uint32_t bsp_timing_uart_receive( uart_data_t *uart_data , uint8_t flag );

uint32_t bsp_timing_cfg_wifi_udp( uint8_t flag );

uint32_t bsp_timing_setup_wifi_udp( uint8_t flag );


#endif